package com.hqd.ch03.v50.context.annotation;

import com.hqd.ch03.v50.core.annotation.AliasFor;
import com.hqd.ch03.v50.factory.support.BeanNameGenerator;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
    /**
     * 基础包名，也就是扫描开始的路径
     *
     * @return
     */
    @AliasFor("basePackages")
    String[] value() default {};

    @AliasFor("value")
    String[] basePackages() default {};

    /**
     * 按类型进行扫描
     *
     * @return
     */
    Class<?>[] basePackageClasses() default {};

    /**
     * Bean名称生成器
     *
     * @return
     */
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    /**
     * 作用域
     *
     * @return
     */
    Class<? extends ScopeMetadataResolver> scopeResolver() default AnnotationScopeMetadataResolver.class;

    /**
     * 代理模式
     *
     * @return
     */
    ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;

    String resourcePattern() default ClassPathScanningCandidateComponentProvider.DEFAULT_RESOURCE_PATTERN;

    boolean useDefaultFilters() default true;

    Filter[] includeFilters() default {};

    Filter[] excludeFilters() default {};

    /**
     * 是否懒加载
     *
     * @return
     */
    boolean lazyInit() default false;


    /**
     * 过滤器
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target({})
    @interface Filter {

        /**
         * 过滤器类型
         *
         * @return
         */
        FilterType type() default FilterType.ANNOTATION;

        /**
         * 过滤器
         *
         * @return
         */
        @AliasFor("classes")
        Class<?>[] value() default {};

        @AliasFor("value")
        Class<?>[] classes() default {};

        /**
         * 字符串过滤
         *
         * @return
         */
        String[] pattern() default {};

    }

}
